<?php
// +----------------------------------------------
// | Created by PhpStorm
// +----------------------------------------------
// | Author: YnnSon
// +----------------------------------------------
namespace app\lib\exception;

use Exception;
use think\Config;
use think\exception\Handle;
use think\Log;
use think\Request;

/**
 * 重写Handle的render方法，实现自定义异常消息
 * Class ExceptionHandler
 * @package app\lib\exception
 */
class ExceptionHandler extends Handle
{
    public function render(Exception $e)
    {
        // 如果是继承Base基类的自定义异常，不需要记录日志, 直接返回客户端错误信息
        // 因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
        if ($e instanceof BaseException) {
            $code = $e->code;
            $message = $e->message;
            $errorCode = $e->errorCode;
        } else {
            // 调试模式开启时需要显示TP默认的异常页面，因为TP的默认页面很容易看出问题
            if (Config::get('app_debug')) {
                return parent::render($e);
            }
            // 如果是服务器未处理的异常，将http状态码设置为500，并记录日志
            $code = 500;
            $message = '服务器内部错误';
            $errorCode = 999;
        }
        // 将异常写入日志
        $this->recordErrorLog($e);
        $result = [
            'code'        => $errorCode,
            'message'     => $message,
            'request_url' => Request::instance()->url(),
        ];
        return json($result, $code);
    }

    /**
     * @Desc 将异常写入日志
     *
     * @param Exception $e
     */
    private function recordErrorLog(Exception $e)
    {
        Log::init([
            'type'        => 'File',
            'path'        => LOG_PATH,
            // error和sql日志单独记录
            'apart_level' => ['error', 'sql'],
            'max_files'   => 30,
        ]);
        Log::error('错误信息：' . $e->getMessage());
    }
}